package com.wugui.datax.admin.util;

import com.wugui.datatx.core.util.Constants;

/**
 * RdbmsException
 *
 * @author jingwk @ClassName RdbmsException @Version 2.1.1
 * @since 2020/03/14 07:15
 */
public class RdbmsException extends DataXException {

  public RdbmsException(ErrorCode errorCode, String errorMessage) {
    super(errorCode, errorMessage);
  }

  public static DataXException asConnException(
      String dataBaseType, Exception e, String userName, String dbName) {
    if (dataBaseType.equals(JdbcConstants.MYSQL)) {
      DBUtilErrorCode dbUtilErrorCode = mySqlConnectionErrorAna(e.getMessage());
      if (dbUtilErrorCode == DBUtilErrorCode.MYSQL_CONN_DB_ERROR && dbName != null) {
        return DataXException.asDataXException(
            dbUtilErrorCode, "该数据库名称为：" + dbName + " 具体错误信息为：" + e);
      }
      if (dbUtilErrorCode == DBUtilErrorCode.MYSQL_CONN_USERPWD_ERROR) {
        return DataXException.asDataXException(
            dbUtilErrorCode, "该数据库用户名为：" + userName + " 具体错误信息为：" + e);
      }
      return DataXException.asDataXException(dbUtilErrorCode, " 具体错误信息为：" + e);
    }

    if (dataBaseType.equals(JdbcConstants.ORACLE)) {
      DBUtilErrorCode dbUtilErrorCode = oracleConnectionErrorAna(e.getMessage());
      if (dbUtilErrorCode == DBUtilErrorCode.ORACLE_CONN_DB_ERROR && dbName != null) {
        return DataXException.asDataXException(
            dbUtilErrorCode, "该数据库名称为：" + dbName + " 具体错误信息为：" + e);
      }
      if (dbUtilErrorCode == DBUtilErrorCode.ORACLE_CONN_USERPWD_ERROR) {
        return DataXException.asDataXException(
            dbUtilErrorCode, "该数据库用户名为：" + userName + " 具体错误信息为：" + e);
      }
      return DataXException.asDataXException(dbUtilErrorCode, " 具体错误信息为：" + e);
    }
    return DataXException.asDataXException(DBUtilErrorCode.CONN_DB_ERROR, " 具体错误信息为：" + e);
  }

  public static DBUtilErrorCode mySqlConnectionErrorAna(String e) {
    if (e.contains(Constants.MYSQL_DATABASE)) {
      return DBUtilErrorCode.MYSQL_CONN_DB_ERROR;
    }

    if (e.contains(Constants.MYSQL_CONNEXP)) {
      return DBUtilErrorCode.MYSQL_CONN_IPPORT_ERROR;
    }

    if (e.contains(Constants.MYSQL_ACCDENIED)) {
      return DBUtilErrorCode.MYSQL_CONN_USERPWD_ERROR;
    }

    return DBUtilErrorCode.CONN_DB_ERROR;
  }

  public static DBUtilErrorCode oracleConnectionErrorAna(String e) {
    if (e.contains(Constants.ORACLE_DATABASE)) {
      return DBUtilErrorCode.ORACLE_CONN_DB_ERROR;
    }

    if (e.contains(Constants.ORACLE_CONNEXP)) {
      return DBUtilErrorCode.ORACLE_CONN_IPPORT_ERROR;
    }

    if (e.contains(Constants.ORACLE_ACCDENIED)) {
      return DBUtilErrorCode.ORACLE_CONN_USERPWD_ERROR;
    }

    return DBUtilErrorCode.CONN_DB_ERROR;
  }

  public static DataXException asQueryException(
      String dataBaseType, Exception e, String querySql, String table, String userName) {
    if (dataBaseType.equals(JdbcConstants.MYSQL)) {
      DBUtilErrorCode dbUtilErrorCode = mySqlQueryErrorAna(e.getMessage());
      if (dbUtilErrorCode == DBUtilErrorCode.MYSQL_QUERY_TABLE_NAME_ERROR && table != null) {
        return DataXException.asDataXException(
            dbUtilErrorCode, "表名为：" + table + " 执行的SQL为:" + querySql + " 具体错误信息为：" + e);
      }
      if (dbUtilErrorCode == DBUtilErrorCode.MYSQL_QUERY_SELECT_PRI_ERROR && userName != null) {
        return DataXException.asDataXException(
            dbUtilErrorCode, "用户名为：" + userName + " 具体错误信息为：" + e);
      }

      return DataXException.asDataXException(
          dbUtilErrorCode, "执行的SQL为: " + querySql + " 具体错误信息为：" + e);
    }

    if (dataBaseType.equals(JdbcConstants.ORACLE)) {
      DBUtilErrorCode dbUtilErrorCode = oracleQueryErrorAna(e.getMessage());
      if (dbUtilErrorCode == DBUtilErrorCode.ORACLE_QUERY_TABLE_NAME_ERROR && table != null) {
        return DataXException.asDataXException(
            dbUtilErrorCode, "表名为：" + table + " 执行的SQL为:" + querySql + " 具体错误信息为：" + e);
      }
      if (dbUtilErrorCode == DBUtilErrorCode.ORACLE_QUERY_SELECT_PRI_ERROR) {
        return DataXException.asDataXException(
            dbUtilErrorCode, "用户名为：" + userName + " 具体错误信息为：" + e);
      }

      return DataXException.asDataXException(
          dbUtilErrorCode, "执行的SQL为: " + querySql + " 具体错误信息为：" + e);
    }

    return DataXException.asDataXException(
        DBUtilErrorCode.SQL_EXECUTE_FAIL, "执行的SQL为: " + querySql + " 具体错误信息为：" + e);
  }

  public static DBUtilErrorCode mySqlQueryErrorAna(String e) {
    if (e.contains(Constants.MYSQL_TABLE_NAME_ERR1)
        && e.contains(Constants.MYSQL_TABLE_NAME_ERR2)) {
      return DBUtilErrorCode.MYSQL_QUERY_TABLE_NAME_ERROR;
    } else if (e.contains(Constants.MYSQL_SELECT_PRI)) {
      return DBUtilErrorCode.MYSQL_QUERY_SELECT_PRI_ERROR;
    } else if (e.contains(Constants.MYSQL_COLUMN1) && e.contains(Constants.MYSQL_COLUMN2)) {
      return DBUtilErrorCode.MYSQL_QUERY_COLUMN_ERROR;
    } else if (e.contains(Constants.MYSQL_WHERE)) {
      return DBUtilErrorCode.MYSQL_QUERY_SQL_ERROR;
    }
    return DBUtilErrorCode.READ_RECORD_FAIL;
  }

  public static DBUtilErrorCode oracleQueryErrorAna(String e) {
    if (e.contains(Constants.ORACLE_TABLE_NAME)) {
      return DBUtilErrorCode.ORACLE_QUERY_TABLE_NAME_ERROR;
    } else if (e.contains(Constants.ORACLE_SQL)) {
      return DBUtilErrorCode.ORACLE_QUERY_SQL_ERROR;
    } else if (e.contains(Constants.ORACLE_SELECT_PRI)) {
      return DBUtilErrorCode.ORACLE_QUERY_SELECT_PRI_ERROR;
    }
    return DBUtilErrorCode.READ_RECORD_FAIL;
  }

  public static DataXException asSqlParserException(
      String dataBaseType, Exception e, String querySql) {
    if (dataBaseType.equals(JdbcConstants.MYSQL)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.MYSQL_QUERY_SQL_PARSER_ERROR, "执行的SQL为:" + querySql + " 具体错误信息为：" + e);
    }
    if (dataBaseType.equals(JdbcConstants.ORACLE)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.ORACLE_QUERY_SQL_PARSER_ERROR, "执行的SQL为:" + querySql + " 具体错误信息为：" + e);
    }
    throw DataXException.asDataXException(
        DBUtilErrorCode.READ_RECORD_FAIL, "执行的SQL为:" + querySql + " 具体错误信息为：" + e);
  }

  public static DataXException asPreSQLParserException(
      String dataBaseType, Exception e, String querySql) {
    if (dataBaseType.equals(JdbcConstants.MYSQL)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.MYSQL_PRE_SQL_ERROR, "执行的SQL为:" + querySql + " 具体错误信息为：" + e);
    }

    if (dataBaseType.equals(JdbcConstants.ORACLE)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.ORACLE_PRE_SQL_ERROR, "执行的SQL为:" + querySql + " 具体错误信息为：" + e);
    }
    throw DataXException.asDataXException(
        DBUtilErrorCode.READ_RECORD_FAIL, "执行的SQL为:" + querySql + " 具体错误信息为：" + e);
  }

  public static DataXException asPostSQLParserException(
      String dataBaseType, Exception e, String querySql) {
    if (dataBaseType.equals(JdbcConstants.MYSQL)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.MYSQL_POST_SQL_ERROR, "执行的SQL为:" + querySql + " 具体错误信息为：" + e);
    }

    if (dataBaseType.equals(JdbcConstants.ORACLE)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.ORACLE_POST_SQL_ERROR, "执行的SQL为:" + querySql + " 具体错误信息为：" + e);
    }
    throw DataXException.asDataXException(
        DBUtilErrorCode.READ_RECORD_FAIL, "执行的SQL为:" + querySql + " 具体错误信息为：" + e);
  }

  public static DataXException asInsertPriException(
      String dataBaseType, String userName, String jdbcUrl) {
    if (dataBaseType.equals(JdbcConstants.MYSQL)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.MYSQL_INSERT_ERROR, "用户名为:" + userName + " jdbcURL为：" + jdbcUrl);
    }

    if (dataBaseType.equals(JdbcConstants.ORACLE)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.ORACLE_INSERT_ERROR, "用户名为:" + userName + " jdbcURL为：" + jdbcUrl);
    }
    throw DataXException.asDataXException(
        DBUtilErrorCode.NO_INSERT_PRIVILEGE, "用户名为:" + userName + " jdbcURL为：" + jdbcUrl);
  }

  public static DataXException asDeletePriException(
      String dataBaseType, String userName, String jdbcUrl) {
    if (dataBaseType.equals(JdbcConstants.MYSQL)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.MYSQL_DELETE_ERROR, "用户名为:" + userName + " jdbcURL为：" + jdbcUrl);
    }

    if (dataBaseType.equals(JdbcConstants.ORACLE)) {
      throw DataXException.asDataXException(
          DBUtilErrorCode.ORACLE_DELETE_ERROR, "用户名为:" + userName + " jdbcURL为：" + jdbcUrl);
    }
    throw DataXException.asDataXException(
        DBUtilErrorCode.NO_DELETE_PRIVILEGE, "用户名为:" + userName + " jdbcURL为：" + jdbcUrl);
  }

  public static DataXException asSplitPKException(
      String dataBaseType, Exception e, String splitSql, String splitPkID) {
    if (dataBaseType.equals(JdbcConstants.MYSQL)) {

      return DataXException.asDataXException(
          DBUtilErrorCode.MYSQL_SPLIT_PK_ERROR,
          "配置的SplitPK为: " + splitPkID + ", 执行的SQL为: " + splitSql + " 具体错误信息为：" + e);
    }

    if (dataBaseType.equals(JdbcConstants.ORACLE)) {
      return DataXException.asDataXException(
          DBUtilErrorCode.ORACLE_SPLIT_PK_ERROR,
          "配置的SplitPK为: " + splitPkID + ", 执行的SQL为: " + splitSql + " 具体错误信息为：" + e);
    }

    return DataXException.asDataXException(DBUtilErrorCode.READ_RECORD_FAIL, splitSql + e);
  }
}
